package algorithm.无重复字符的最长子串;

import java.util.HashSet;
import java.util.Set;

class Solution {


    public static void main(String[] args) {
        System.out.println(lengthOfLongestSubstring("abcbdef"));
    }

    public static int lengthOfLongestSubstring(String s) {
        //set 元素不重复，用于存储子串字符
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        //右指针，先右移动
        int rk = -1;
        int maxLength = 0;
        //左指针，也需要右移
        for (int i = 0; i < n; ++i) {
            //如果有指针走了，结束循环
            if(rk+1==n){
                break;
            }
            //逐个清除元素，直到重复位置
            if (i != 0) {
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                // 不断地移动右指针
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            //设置最大子串长度
            maxLength = Math.max(maxLength, rk - i + 1);
        }
        return maxLength;
    }
}
